const https = require('https');
const urlQuery = require("querystring");
const axios = require("axios")
const redis = require("../../redis/redis-client");
const puppeteer = require("puppeteer");
const path = require('path');
const fs = require("fs");

// 出库工作台的数据列表
const outWorkbenchList = [];

//使用 puppeteer.launch 启动 Chrome
(async () => {

  // 连接已打开的浏览器
  let wsKey = await axios.get('http://localhost:21222/json/version');
  const browser = await puppeteer.connect({
    browserWSEndpoint: wsKey.data.webSocketDebuggerUrl,
    defaultViewport: null,
    slowMo: 100,
  })

  // 入库工作台的数据列表
  const inputWorkbenchList = [];

  const sendData = [];
  //当前执行的条数
  let currentItem = 0;

  //每条占滚动条比率
  let ScrollRatio = 0;

  // 当前在第几页
  let currentPage = 1;

  // 获取总页数
  let totalpages = 0;

  // 每次移动条数
  const count = 15;

  // 打开新的浏览器
  // const browser = await puppeteer.launch(
  //   {
  //     headless: false,
  //     defaultViewport: null,
  //     slowMo: 100,
  //     args: [
  //       '--no-sandbox',
  //       '--disable-features=site-per-process',
  //       '--start-maximized'
  //     ],
  //     timeout: 60000
  //   },
  // );

  const page = await browser.newPage();
  await page.goto("http://10.139.3.16/sainty/");

  const submitBtnEle = await page.$("input[id='LOGINSUBMIT']");
  if (submitBtnEle) {
    await submitBtnEle.click();
  }


  await page.waitForSelector(".menu-warp");
  const lineMenu = await page.$("a[title='仓储物流']");
  await lineMenu.click();

  const inputWorkbench = await page.$("a[title='出库工作台']");
  await inputWorkbench.click();

  const iframe = await page.waitForFrame((frame) => (frame.url().includes("27.25.20.10.10.N9STJ.html")));


  if (iframe) {

    // 监听请求的响应的
    page.on("response", (response) => {
      if (response.status() == 200) {
        if (response.url().includes("27.25.20.10.10.N9STJ.do.ui")) {
          // url query 参数转json
          const queryJson = urlQuery.parse(response.request().postData());

          // 当前组织代码 G118
          if (queryJson && queryJson.salshipcode && queryJson.salshipcode == "G118") {
            response.text().then(res => {
              // 解析字符串形的对象
              const resData = eval("(" + res + ")");
              // 存储的字段数组
              const fields = resData.fields;
              
              totalpages = resData.rows.length;

              resData.rows.map((item) => {

                outWorkbenchList.push({
                  "exportContractId": item[0], //出口合同号
                  "deliveryTransportId": item[2].trim(), //出库运编号
                  "clientName": getValueByNameId("ccode", item[5], fields), //客户
                  "clientItemId": item[6], //客户货号
                  "deliveryDate": item[7], //出运确认日期
                  "transportId": item[8], //入库运编号
                  "warehouse": getValueByNameId("scode", item[9], fields),//发货仓库
                  "daysOut": item[10],//超出天数
                  "goodsName": item[11],//商品名称
                  "total": item[15],//发货数量
                  "sentNumber": item[16],//已出库数量
                  "willSendNumber": item[17],//待出库数量
                  "units": getValueByNameId("qtcunit", item[18], fields),//单位
                  "member": getValueByNameId("wcode", item[30], fields),//人员
                  "department": getValueByNameId("bcode", item[31], fields),//部门
                  "operator": getValueByNameId("corpbcode", item[32], fields),//经营单位
                  "goods": []//货品
                })
                // key 出口合同号+ 出库运编号id+客户货号+超出天数+发货数量   value 1
                const key = (item[0] + item[2].trim() + item[6] + item[10] + item[15])
                console.log(key);
                redis.setString(key, 1);
              })

              // 循环获取列表
              forList()
            })

          }
        }
      }
    })


    // 输入入库运编号
    const inputIdEl = await iframe.$("input[name='salshipcode']");
    await inputIdEl.type("G118", { delay: 20 });

    // 点击查询
    const searchEl = await iframe.$("#UIA_queryQ_btn_wrefreshtbls");
    await searchEl.click();

    await page.waitForTimeout(3000);

  }

  // 方法区--------------------------------------------------------------

  /**
   * 
   * @param {*} name 字段标识
   * @param {*} Id 字段的id值
   * @param {*} array 所有的字段信息数组
   * @returns 匹配到的值
   */

  function getValueByNameId(name, Id, array) {
    let value = "";
    array.map((item) => {
      if (item.name == name) {
        value = item.valueMap[Id]
      }
    })
    return value
  }

  // 出库列表接口 发送数据
  function sendListToServer(data) {
    const postData = JSON.stringify(data);
    console.log(postData);

    const req = https.request({
      hostname: 'zhuyiyun.com',
      path: '/openapi/webhook/842298925882507267/844580224431325187',
      port: 443,
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'secretKey': '8b95cf4b511b49b2901272c4a1351b57'
      }
    }, (res) => {
      console.log("statusCode:", res.statusCode);
    });

    // 设置要发送的内容
    req.write(postData);
    // 如果出错就在控制台输出错误信息
    req.on('error', err => {
      console.log(err);
    });

    req.end();
  }

  //轮循获取入库工作台列表
  async function forList() {
    await page.waitForTimeout(2000);

    //计算比率
    var scrollHeight = await iframe.$eval(".ui-gridtable .ui-grid-bar", el => el.scrollHeight)
    ScrollRatio = scrollHeight / totalpages;

    // 移除监听采购订单合同列表
    page.removeListener('response');

    // 监听采购合同请求里的商品信息
    onGoods();

    // -----------------------开始轮循点击采购合同---------------------------------
    // 点击当前视图可见的采购合同订单id 请求商品信息
    await forClickId();
  }


  // 监听采购合同点击
  function onGoods() {
    page.on("response", (response) => {
      if (response.status() == 200) {
        if (response.url().includes("27.15.40.G0.20.N9STJ.do.ui")) {

          // url query 参数转json
          const queryJson = urlQuery.parse(response.request().postData());

          // 商品信息的接口
          if (queryJson && queryJson.gcodeCuicode) {
            response.text().then(res => {
              // 解析字符串形的对象
              const resData = eval("(" + res + ")");
              // 存储的字段数组
              const fields = resData.fields;
              let goods = [];
              resData.rows.map((item) => {
                goods.push({
                  "clientOrderId": item[1],//客户订单号
                  "clientItemId": item[2], //客户货号
                  "hsCode": item[3], //海关编码
                  "auxiliaryCode": item[4],//辅码
                  "goodsName": item[7],//商品名称
                  "englishName": item[8],//英文名称
                  "actualSendCount": item[13],//实际出运数量
                  "actualSendUnits": item[14],//实际出运单位
                  "totalPackages": item[20], //包装件数 总件数
                  "packagesUnit": getValueByNameId("qtxunit", item[21], fields), //包装单位
                  "clearanceCount": item[22],//报关数量
                  "clearanceUnits": item[23],//报关单位
                  "roughWeight": item[26], //毛重
                  "netWeight": item[27], //净重
                  "roughWeightTotal": item[28], //毛重合计
                  "netWeightTotal": item[29], //净重合计
                  "volumeLength": item[30],//尺寸描述长度
                  "volumeWidth": item[31],//尺寸描述宽度
                  "volumeHeight": item[32],//尺寸描述高度
                  "volumeTotal": item[33],//体积合计
                  "clearanceGoodsName": item[34],//开票及报关品名
                  "builtinNum": item[35], //内装数量
                  "exteriorNum": item[36], //外装数量
                  "packType": getValueByNameId("packtype", item[47], fields), //包装类型
                  "purchaseContractId": item[51],//采购合同号
                  "exportContractId": item[52],//出口合同号
                  "specification": item[53],//规格
                  "boxId": item[81],//箱号
                  "matrixingRatio": item[82], //换算比例
                  "total": item[83], //统计总数
                  "units": getValueByNameId("qtcunit", item[84], fields), //统计单位
                  "domesticSource": getValueByNameId("domesticsource", item[88], fields),//境内货源地
                  "remarks": item[115],//备注
                  "deliveryTransportId": item[100].trim()
                  // "targetHsCode": item[111],//目的国海关编码
                  // "targetAuxiliaryCode": item[112],//目的国海关编码辅码
                  // "targetEnglishDesc": item[113],//目的国英文品描
                  // "deliveryAddress": getValueByNameId("deliverysite", item[114], fields),//交货地址
                })
              })
              //  把goods放入采购合同id的goods里
              if (goods.length) {
                const deliveryTransportIds = outWorkbenchList.filter(({ deliveryTransportId }) => deliveryTransportId == goods[0].deliveryTransportId);
                deliveryTransportIds.map((item) => {
                  item.goods = goods
                  // 调接口发送所有的出库列表数据
                  sendListToServer(item);
                })
              }
            })
          }

          // 商品详情的接口 获取合同id 和修改日期
          if (queryJson && queryJson["__Json_._LoadWFInfo"]) {
            response.text().then(res => {
              // 解析字符串形的对象
              const resData = eval("(" + res + ")");
              if (resData.rows.length) {
                // key 出库运编号id  value 修改时间
                redis.setString(resData.rows[0][0].trim(), new Date(resData.rows[0][48]).getTime());
              }
            })
          }
        }
      }
    })
  }

  // 循环点击采购订单合同
  async function forClickId() {

    // 当前页面的15条合同id
    const div = await iframe.$$eval(".gtable tbody tr:not(.emptyrow) td:nth-child(3)", node => node.map((el) => el.innerText.trim()));
    // console.log("div:", div);

    // 当前页面15条需要点击的元素
    const divId = await iframe.$$(".gtable tbody tr:not(.emptyrow) td:nth-child(3)");
    // 截取页面显示的count条记录
    const list = divId.slice(0, count)

    for (let i = 0; i < list.length; i++) {

      console.log("当前索引：", i, "当前合同id", div[i]);
      let item = outWorkbenchList.find(({ deliveryTransportId }) => div[i] == deliveryTransportId);
      if (item && item.goods.length == 0) {
        const res = await redis.getString(item.deliveryTransportId)
        if (!res) {
          await divId[i].click({ clickCount: 2, delay: 100 });
          // 隐藏弹窗 影响点击事件
          const tiptext = await iframe.$(".x-tiptext.ui-layer-frame");
          if (tiptext) await iframe.$eval(".x-tiptext.ui-layer-frame", node => node.style.display = "none");
          //  找到出口脱单frame
          const goodsIframe = await page.waitForFrame((frame) => (frame.url().includes("27.15.40.G0.20.N9STJ.html")));
          await page.waitForTimeout(1000);

          // 点击发货商品
          const sendGoods = await goodsIframe.$("#TabOfUI_salordergrecord_tab");
          await sendGoods.click()
          await page.waitForTimeout(1000);

          const close = await page.$("#tabChangeUl li:last-child .icol-del3");
          await close.click()
        }
      }
      // 记录执行过的条数
      currentItem++;
      console.log("--------------", "当前执行的条数", currentItem, "总条数", totalpages);
    }

    if (currentItem == totalpages) {
      console.log("end---------inputWorkbenchList:");
      page.close()
      return
    }

    if (currentItem < totalpages) {
      // 执行完当前count条数 滚动翻页 继续执行
      iframe.$eval(".ui-gridtable .ui-grid-bar", (el, { ScrollRatio, currentPage, count }) =>
        (el.scrollTop = ScrollRatio * currentPage * count),
        { ScrollRatio, currentPage, count }
      )

      currentPage++;
      await forClickId()
    }

  }

  // 写入文件
  function writeFile(data, name) {
    fs.writeFile(path + name, JSON.stringify(data), function (err) {
      if (err) return console.log(err);
      console.log("The file was saved!");
    });
  }

  // await browser.close();
})();